From 89f20c2fb646c0637454ed099bd1e10246bee3f0 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 8 Jun 2023 06:55:40 +0200 Subject: [PATCH] vulkan: Only update descriptor sets with contents If one of the descriptor sets doesn't have any items, don't include it in the sets passed to vkUpdateDescriptorSets(). This has no effect right now, because we either have both images and samplers or neither, but it will become relevant once we also support buffers. --- gsk/vulkan/gskvulkanrender.c | 52 +++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/gsk/vulkan/gskvulkanrender.c b/gsk/vulkan/gskvulkanrender.c index 0e3d7dfaa4..1ddd1017d1 100644 --- a/gsk/vulkan/gskvulkanrender.c +++ b/gsk/vulkan/gskvulkanrender.c @@ -524,6 +524,8 @@ static void gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self) { VkDevice device; + VkWriteDescriptorSet descriptor_sets[3]; + gsize n_descriptor_sets; GList *l; device = gdk_vulkan_context_get_device (self->vulkan); @@ -555,28 +557,36 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self) }, &self->descriptor_set); + n_descriptor_sets = 0; + if (gsk_descriptor_image_infos_get_size (&self->descriptor_images) > 0) + { + descriptor_sets[n_descriptor_sets++] = (VkWriteDescriptorSet) { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .dstSet = self->descriptor_set, + .dstBinding = 0, + .dstArrayElement = 0, + .descriptorCount = gsk_descriptor_image_infos_get_size (&self->descriptor_images), + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + .pImageInfo = gsk_descriptor_image_infos_get_data (&self->descriptor_images) + }; + } + + if (gsk_descriptor_image_infos_get_size (&self->descriptor_samplers) > 0) + { + descriptor_sets[n_descriptor_sets++] = (VkWriteDescriptorSet) { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .dstSet = self->descriptor_set, + .dstBinding = 1, + .dstArrayElement = 0, + .descriptorCount = gsk_descriptor_image_infos_get_size (&self->descriptor_samplers), + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, + .pImageInfo = gsk_descriptor_image_infos_get_data (&self->descriptor_samplers) + }; + } + vkUpdateDescriptorSets (device, - 2, - (VkWriteDescriptorSet[2]) { - { - .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, - .dstSet = self->descriptor_set, - .dstBinding = 0, - .dstArrayElement = 0, - .descriptorCount = gsk_descriptor_image_infos_get_size (&self->descriptor_images), - .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, - .pImageInfo = gsk_descriptor_image_infos_get_data (&self->descriptor_images) - }, - { - .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, - .dstSet = self->descriptor_set, - .dstBinding = 1, - .dstArrayElement = 0, - .descriptorCount = gsk_descriptor_image_infos_get_size (&self->descriptor_samplers), - .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, - .pImageInfo = gsk_descriptor_image_infos_get_data (&self->descriptor_samplers) - } - }, + n_descriptor_sets, + descriptor_sets, 0, NULL); } -- 2.30.2